package com.aaa.www;

class Student {

    //private 修饰类外不能访问
    private String name;
    private String gender;
    private int age;
    private double score;

    //静态代码块，一般用于初始化静态成员变量。
    static {
        classRoom = "a101";
        System.out.println("调用静态代码块1");
    }

    //静态成员变量
    private static String classRoom = "a123";

    //静态成员方法
    public static String getClassRoom() {
        return classRoom;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //构造方法
    public Student() {
        System.out.println("调用不带参数的构造方法");
    }

    public Student(String name, String gender, int age, double score) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
        System.out.println("调用4个参数的构造方法");
    }

    //构造代码块，一般用于初始化实例成员变量。
    {
        this.name = "张三";
        this.gender = "男";
        this.age = 18;
        this.score = 4.0;
        System.out.println("调用构造代码块/实例化代码块/非静态代码块");
    }

    //静态代码块，一般用于初始化静态成员变量。
    //静态代码块不管生成多少个对象，其只会执行一次
    //静态成员变量是类的属性，因此是在JVM加载类时开辟空间并初始化的
    //如果一个类中包含多个静态代码块，在编译代码时，编译器会按照定义的先后次序依次执行(合并)
    //实例代码块只有在创建对象时才会执行
    static {
        classRoom = "a101";
        System.out.println("调用静态代码块2");
    }
}

public class Test {
    public static void main(String[] args) {
        //Student s1 = new Student("zhangsan", "男", 18, 3.8);

        Student s1 = new Student();
        //调用静态代码块
        //调用构造代码块/实例化代码块/非静态代码块
        //调用不带参数的构造方法

        System.out.println("====================");

        Student s2 = new Student("haha","ha",1,2);
        //调用构造代码块/实例化代码块/非静态代码块
        //调用不带参数的构造方法

        System.out.println("====================");

        //类名.静态方法
        System.out.println(Student.getClassRoom());

    }
}
